home *** CD-ROM | disk | FTP | other *** search
/ Apple Reference & Presen…tion Library 2 (Reseller) / Apple R&P Lib Reseller v2.0.iso / 3-Demos / HyperCard Demos / HyperCard In Education / HyperTree / stack.txt < prev   
Text File  |  1989-07-14  |  15KB  |  529 lines

  1. -- stack: in
  2. -- format: 8 (HyperCard 1)
  3. -- flags: 0x1000 (none)
  4. -- protect password hash: 0
  5. -- maximum user level: 5 (scripting)
  6. -- window: Rect(x1=0, y1=0, x2=0, y2=0)
  7. -- screen: Rect(x1=0, y1=0, x2=0, y2=0)
  8. -- card dimensions: w=0 h=0
  9. -- scroll: x=0 y=0
  10. -- background count: 1
  11. -- first background id: 2574
  12. -- card count: 2
  13. -- first card id: 3233
  14. -- list block id: 2830
  15. -- print block id: 0
  16. -- font table block id: 0
  17. -- style table block id: 0
  18. -- free block count: 0
  19. -- free size: 0 bytes
  20. -- total size: 19744 bytes
  21. -- stack block size: 13312 bytes
  22. -- created by hypercard version: 0x00000000
  23. -- compacted by hypercard version: 0x01228000
  24. -- modified by hypercard version: 0x01228000
  25. -- opened by hypercard version: 0x01228000
  26. -- patterns[0]: 0x0000000000000000
  27. -- patterns[1]: 0x8000000008000000
  28. -- patterns[2]: 0x8800220088002200
  29. -- patterns[3]: 0x8888222288882222
  30. -- patterns[4]: 0x88AA22AA88AA22AA
  31. -- patterns[5]: 0xCCAA33AACCAA33AA
  32. -- patterns[6]: 0xEEAABBAAEEAABBAA
  33. -- patterns[7]: 0xEEBBBBEEEEBBBBEE
  34. -- patterns[8]: 0xFFBBFFEEFFBBFFEE
  35. -- patterns[9]: 0xFFBBFFFFFFBBFFFF
  36. -- patterns[10]: 0x8010022001084004
  37. -- patterns[11]: 0xFFFFFFFFFFFFFFFF
  38. -- patterns[12]: 0x8822882288228822
  39. -- patterns[13]: 0x1122448811224488
  40. -- patterns[14]: 0xC4800C6843023026
  41. -- patterns[15]: 0xB130031BD8C00C8D
  42. -- patterns[16]: 0xAA00AA00AA00AA00
  43. -- patterns[17]: 0x8822552288225522
  44. -- patterns[18]: 0x8855225588552255
  45. -- patterns[19]: 0x77DD77DD77DD77DD
  46. -- patterns[20]: 0x8000000000000000
  47. -- patterns[21]: 0xAA55AA55AA55AA55
  48. -- patterns[22]: 0x038448300C020101
  49. -- patterns[23]: 0x8244394482010101
  50. -- patterns[24]: 0x8814224188412214
  51. -- patterns[25]: 0x8080413E080814E3
  52. -- patterns[26]: 0x22048C7422179810
  53. -- patterns[27]: 0xBE808808EB088880
  54. -- patterns[28]: 0x25C8328964244C92
  55. -- patterns[29]: 0xA29C41BE2AC914EB
  56. -- patterns[30]: 0x40A00000040A0000
  57. -- patterns[31]: 0x8040200002040800
  58. -- patterns[32]: 0xAA00800088008000
  59. -- patterns[33]: 0xFF80808080808080
  60. -- patterns[34]: 0x081C22C180010204
  61. -- patterns[35]: 0xFF808080FF080808
  62. -- patterns[36]: 0xF87422478F172271
  63. -- patterns[37]: 0xBF00BFBFB0B0B0B0
  64. -- patterns[38]: 0xFF7FBE5DA2418000
  65. -- patterns[39]: 0xFAF5FAF5A050A050
  66. -- checksum: 0x0
  67. ----- HyperTalk script -----
  68. on domenu menu -- Script added by Animatrix 7/14/89
  69.   global RPstackname,RPcardname
  70.   if menu is in "Home,Quit HyperCard" then
  71.     if RPstackname is not empty then
  72.       answer "This will return to "&RPStackname&"."
  73.       set cursor to watch
  74.       lock screen
  75.       go card RPcardname of stack RPstackname
  76.       unlock screen with dissolve
  77.       exit domenu
  78.     else pass domenu -- if RPstackname is empty
  79.   else
  80.     pass domenu -- if menu is not in home or quit
  81.   end if
  82. end domenu
  83.  
  84. on openStack
  85.   defineStruct
  86.   set the lineSize to 1
  87.   set the pattern to 1
  88.   show message at 22,300
  89. end openStack
  90.  
  91. on closeStack
  92.   put empty into message
  93.   set the pattern to 12
  94. end closeStack
  95.  
  96. on openCard
  97.   global rootNode, searchPath, pathLength
  98.   if the number of card fields > 0 then
  99.     put the id of card field 1 into rootNode
  100.   else
  101.     put 0 into rootNode
  102.   end if
  103.   put empty into searchPath
  104.   put 0 into pathLength
  105.   walkTree
  106. end openCard
  107.  
  108. on deleteCard
  109.   global searchPath, pathLength
  110.   put empty into searchPath
  111.   put 0 into pathLength
  112. end deleteCard
  113.  
  114. on closeCard
  115.   undoPlot
  116.   put empty into field treeList
  117. end closeCard
  118.  
  119. on defineStruct
  120.   global rootRect, rootLoc, hSpacing, vSpacing, rootLevel
  121.   put "241,148,271,163" into rootRect
  122.   put "256,155" into rootLoc
  123.   put "16,32,64,128" into hSpacing
  124.   put "30,30,30,30" into vSpacing
  125.   put 4 into rootLevel
  126. end defineStruct
  127.  
  128. on eraseTree
  129.   global rootNode, seachPath, pathLength
  130.   choose select tool
  131.   drag from 0,0 to 512,342
  132.   doMenu "Clear Picture"
  133.   choose field tool
  134.   repeat with i = the number of card fields down to 1
  135.     click at the loc of card field i
  136.     doMenu "Clear Field"
  137.   end repeat
  138.   put 0 into rootNode
  139.   put empty into searchPath
  140.   put 0 into pathLength
  141.   choose browse tool
  142. end eraseTree
  143.  
  144. on initPlot targetNode
  145.   global searchPath, pathLength
  146.   undoPlot
  147.   put targetNode into line 1 of searchPath
  148.   put the loc of card field id targetNode into line 2 of searchPath
  149.   put 2 into pathLength
  150.   set the style of card field id targetNode to shadow
  151.   set the lineSize to 2
  152.   choose line tool
  153. end initPlot
  154.  
  155. on termPlot
  156.   set the lineSize to 1
  157.   choose browse tool
  158. end termPlot
  159.  
  160. on pathPlot targetNode
  161.   global searchPath, pathLength
  162.   if targetNode ‚↠0 then
  163.     add 1 to pathLength
  164.     put targetNode into line pathLength of searchPath
  165.     add 1 to pathLength
  166.     put the loc of card field id targetNode into line pathLength of searchPath
  167.     set the style of card field id targetNode to shadow
  168.     drag from line pathLength - 2 of searchPath to line pathLength of searchPath
  169.   end if
  170. end pathPlot
  171.  
  172. on undoPlot
  173.   global searchPath, pathLength
  174.   if pathLength > 0 then
  175.     choose line tool
  176.     put line 1 of searchPath into targetNode
  177.     set the style of card field id targetNode to rectangle
  178.     put line 2 of searchPath into parentLoc
  179.     put 3 into pathIndex
  180.     repeat while pathIndex < pathLength
  181.       put line pathIndex of searchPath into targetNode
  182.       add 1 to pathIndex
  183.       get line pathIndex of searchPath
  184.       add 1 to pathIndex
  185.       set the style of card field id targetNode to rectangle
  186.       set the lineSize to 2
  187.       drag from parentLoc to it with optionKey
  188.       set the lineSize to 1
  189.       drag from parentLoc to it
  190.       put it into parentLoc
  191.     end repeat
  192.     put empty into searchPath
  193.     put 0 into pathLength
  194.     choose browse tool
  195.   end if
  196. end undoPlot
  197.  
  198. function searchTree key
  199. global rootNode, rootLevel
  200. global parentSide, parentNode, parentLevel, targetNode
  201. put 0 into parentSide
  202. put 0 into parentNode
  203. put rootLevel + 1 into parentLevel
  204. if rootNode = 0 then
  205.   put 0 into targetNode
  206.   return "missing"
  207. else
  208.   initPlot rootNode
  209.   if key = line 1 of card field id rootNode then
  210.     put rootNode into targetNode
  211.     return "found"
  212.   end if
  213. end if
  214. put rootNode into parentNode
  215. put rootLevel into parentLevel
  216. put 0 into targetNode
  217. repeat while true
  218.   get line 1 of card field id parentNode
  219.   if key < it then
  220.     put 2 into parentSide
  221.     get line 2 of card field id parentNode
  222.     if it ‚↠0 then
  223.       pathPlot it
  224.       if key = line 1 of card field id it then
  225.         put it into targetNode
  226.         return "found"
  227.       else
  228.         put it into parentNode
  229.         subtract 1 from parentLevel
  230.       end if
  231.     else
  232.       return "missing"
  233.     end if
  234.   else
  235.     if key > it then
  236.       put 3 into parentSide
  237.       get line 3 of card field id parentNode
  238.       if it ‚↠0 then
  239.         pathPlot it
  240.         if key = line 1 of card field id it then
  241.           put it into targetNode
  242.           return "found"
  243.         else
  244.           put it into parentNode
  245.           subtract 1 from parentLevel
  246.         end if
  247.       else
  248.         return "missing"
  249.       end if
  250.     end if
  251.   end if
  252. end repeat
  253. end searchTree
  254.  
  255. function newNode nodeLoc
  256. global rootRect
  257. choose field tool
  258. doMenu "New Field"
  259. get the number of card fields
  260. get the id of card field it
  261. set the rect of card field id it to rootRect
  262. set the loc of card field id it to nodeLoc
  263. set the style of card field id it to rectangle
  264. set the textFont of card field id it to geneva
  265. set the textSize of card field id it to 9
  266. set the textAlign of card field id it to center
  267. set the lockText of card field id it to true
  268. put 0 into line 2 of card field id it
  269. put 0 into line 3 of card field id it
  270. return it
  271. end newNode
  272.  
  273. function getNodeLoc parentSide, parentNode, parentLevel
  274. global rootLoc, hSpacing, vSpacing
  275. if parentNode = 0 then
  276.   return rootLoc
  277. else
  278.   put the loc of card field id parentNode into nodeLoc
  279.   get item parentLevel of vSpacing
  280.   add it to item 2 of nodeLoc
  281.   get item parentLevel of hSpacing
  282.   if parentSide = 2 then
  283.     subtract it from item 1 of nodeLoc
  284.   else
  285.     add it to item 1 of nodeLoc
  286.   end if
  287.   return nodeLoc
  288. end if
  289. end getNodeLoc
  290.  
  291. function makeNode parentSide, parentNode, parentLevel
  292. global rootLoc
  293. if parentNode = 0 then
  294.   get newNode( rootLoc )
  295.   initPlot it
  296.   return it
  297. else
  298.   put getNodeLoc( parentSide, parentNode, parentLevel ) into nodeLoc
  299.   get newNode( nodeLoc )
  300.   put it into line parentSide of card field id parentNode
  301.   choose line tool
  302.   pathPlot it
  303.   return it
  304. end if
  305. end makeNode
  306.  
  307. function insertNode key
  308. global rootNode, parentSide, parentNode, parentLevel
  309. get searchTree( key )
  310. if it = "found" then
  311.   termPlot
  312.   return "duplicate"
  313. end if
  314. if parentLevel = 0 then
  315.   termPlot
  316.   return "full"
  317. end if
  318. put makeNode( parentSide, parentNode, parentLevel ) into theNode
  319. put key into line 1 of card field id theNode
  320. if parentNode = 0 then put theNode into rootNode
  321. termPlot
  322. return "inserted"
  323. end insertNode
  324.  
  325. on moveSubTree parentSide, parentNode, parentLevel, nextNode
  326.   if nextNode ‚↠0 then
  327.     put the loc of card field id nextNode into oldLoc
  328.     put getNodeLoc( parentSide, parentNode, parentLevel ) into newLoc
  329.     set the loc of card field id nextNode to newLoc
  330.     get line 2 of card field id nextNode
  331.     if it ‚↠0 then
  332.       drag from oldLoc to the loc of card field id it with optionKey
  333.       moveSubTree 2, nextNode, parentLevel - 1, it
  334.     end if
  335.     get line 3 of card field id nextNode
  336.     if it ‚↠0 then
  337.       drag from oldLoc to the loc of card field id it with optionKey
  338.       moveSubTree 3, nextNode, parentLevel - 1, it
  339.     end if
  340.     if parentNode ‚↠0 then
  341.       drag from the loc of card field id parentNode to newLoc
  342.     end if
  343.   end if
  344. end moveSubTree
  345.  
  346. function removeNode parentSide, parentNode, parentLevel, targetNode
  347. global rootNode
  348. put line 1 of card field id targetNode into key
  349. if line 2 of card field id targetNode = 0 then
  350.   put line 3 of card field id targetNode into nextNode
  351. else
  352.   put line 2 of card field id targetNode into nextNode
  353. end if
  354. choose line tool
  355. if parentNode ‚↠0 then
  356.   drag from the loc of card field id parentNode to the loc of card field id targetNode with optionKey
  357.   set the lineSize to 1
  358. end if
  359. if nextNode ‚↠0 then
  360.   drag from the loc of card field id targetNode to the loc of card field id nextNode with optionKey
  361. end if
  362. choose field tool
  363. click at the loc of card field id targetNode
  364. doMenu "Clear Field"
  365. if parentNode ‚↠0 then
  366.   put nextNode into line parentSide of card field id parentNode
  367. end if
  368. if targetNode = rootNode then put nextNode into rootNode
  369. choose line tool
  370. moveSubTree parentSide, parentNode, parentLevel, nextNode
  371. return key
  372. end removeNode
  373.  
  374. on findNext
  375.   global parentSide, parentNode, parentLevel, targetNode
  376.   put "Looking for the successor to node" && line 1 of card field id targetNode into message
  377.   put 3 into parentSide
  378.   put targetNode into parentNode
  379.   subtract 1 from parentLevel
  380.   put line 3 of card field id parentNode into targetNode
  381.   pathPlot targetNode
  382.   get line 2 of card field id targetNode
  383.   repeat while it ‚↠0
  384.     put 2 into parentSide
  385.     put targetNode into parentNode
  386.     subtract 1 from parentLevel
  387.     put it into targetNode
  388.     pathPlot it
  389.     get line 2 of card field id targetNode
  390.   end repeat
  391. end findNext
  392.  
  393. function deleteNode key
  394. global parentSide, parentNode, parentLevel, targetNode, pathLength
  395. get searchTree( key )
  396. if it = "missing" then
  397.   termPlot
  398.   return it
  399. end if
  400. if line 2 of card field id targetNode = 0 or line 3 of card field id targetNode = 0 then
  401.   get removeNode( parentSide, parentNode, parentLevel, targetNode )
  402. else
  403.   put targetNode into oldTargetNode
  404.   findNext
  405.   get removeNode( parentSide, parentNode, parentLevel, targetNode )
  406.   put it into line 1 of card field id oldTargetNode
  407. end if
  408. subtract 2 from pathLength
  409. termPlot
  410. return "deleted"
  411. end deleteNode
  412.  
  413. on traverseTree theNode
  414.   global listLine
  415.   if theNode ‚↠0 then
  416.     traverseTree line 2 of card field id theNode
  417.     add 1 to listLine
  418.     put line 1 of card field id theNode into line listLine of field treeList
  419.     traverseTree line 3 of card field id theNode
  420.   end if
  421. end traverseTree
  422.  
  423. on makeSubTree parentNode, parentLevel
  424.   if parentLevel > 0 then
  425.     get makeNode( 2, parentNode, parentLevel )
  426.     makeSubTree it, parentLevel - 1
  427.     get makeNode( 3, parentNode, parentLevel )
  428.     makeSubTree it, parentLevel - 1
  429.   end if
  430. end makeSubTree
  431.  
  432. on enumTree
  433.   global rootLoc, rootLevel, rootNode
  434.   put newNode( rootLoc ) into rootNode
  435.   makeSubTree rootNode, rootLevel
  436.   choose browse tool
  437. end enumTree
  438.  
  439. on newTree
  440.   eraseTree
  441.   put empty into field treeList
  442.   put "The tree is empty" into message
  443. end newTree
  444.  
  445. function sideName parentSide
  446. if parentSide = 2 then
  447.   return "left"
  448. else
  449.   return "right"
  450. end if
  451. end sideName
  452.  
  453. on findNode
  454.   global parentSide, parentNode, parentLevel, targetNode
  455.   ask "3 digit search key?"
  456.   put it into key
  457.   get searchTree( key )
  458.   termPlot
  459.   if it = "found" then
  460.     put "Node" && key && "found" into message
  461.   else
  462.     if parentNode = 0 then
  463.       put "The tree is empty" into message
  464.     else
  465.       put "Node" && key && "missing" && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  466.     end if
  467.   end if
  468.   choose browse tool
  469. end findNode
  470.  
  471. on putInNode
  472.   global parentSide, parentNode, parentLevel, targetNode
  473.   ask "3 digit node key?"
  474.   put it into key
  475.   get insertNode( key )
  476.   if it = "duplicate" then
  477.     put "Node" && key && "already exists" into message
  478.   else
  479.     if it = "full" then
  480.       put "No room to insert node" && key && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  481.     else
  482.       put empty into field treeList
  483.       if parentNode = 0 then
  484.         put "Node" && key && "inserted as the root node" into message
  485.       else
  486.         put "Node" && key && "inserted" && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  487.       end if
  488.     end if
  489.   end if
  490.   choose browse tool
  491. end putInNode
  492.  
  493. on takeAwayNode
  494.   global parentSide, parentNode, parentLevel, targetNode
  495.   ask "3 digit node key?"
  496.   put it into key
  497.   get deleteNode( key )
  498.   if it = "missing" then
  499.     if parentNode = 0 then
  500.       put "The tree is empty" into message
  501.     else
  502.       put "Node" && key && "missing" && sideName( parentSide ) && "of node" && line 1 of card field id parentNode into message
  503.     end if
  504.   else
  505.     put empty into field treeList
  506.     put "Node" && key && "deleted from the tree" into message
  507.   end if
  508.   choose browse tool
  509. end takeAwayNode
  510.  
  511. on walkTree
  512.   global rootNode, listLine
  513.   undoPlot
  514.   put empty into field treeList
  515.   put 0 into listLine
  516.   traverseTree rootNode
  517.   if listLine = 0 then
  518.     put "The tree is empty" into message
  519.   else
  520.     if listLine = 1 then
  521.       put "There is only the root node in the tree" into message
  522.     else
  523.       put "There are" && listLine && "nodes in the tree" into message
  524.     end if
  525.   end if
  526. end walkTree
  527.  
  528.  
  529.